home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
listings
/
v_06_02
/
v6n2065a.txt
< prev
next >
Wrap
Text File
|
1989-09-26
|
3KB
|
100 lines
----------
WRITTEN: 25/10/87
-------
PURPOSE: This is one of a series of files which take
------- advantage of INT 21H functions under MS-DOS.
In each case the error situation is marked by
the carry flag being set. We use the De Smet
external variable '_carryf' to see whether the
carry is set on return from the function.
If so, the error code can be used to obtain
information about the specific error.
USAGE: int FUN3CH(name, attr, &_carryf)
----- char *name; (ASCIIZ string)
int attr;
char *_carryf;
DEPENDENCIES: De Smet C V 2.44+
------------
Copyright 1987 - Cogar Computer Services Pty. Ltd
---------------------------------------------------------------------
/*
First declare the name of the routine under the heading 'CSEG'.
Note the underscore needed at the end of the name.
*/
CSEG
PUBLIC FUN3CH_
/*
The actual coding of the function follows. Note the technique
to save the setting of the base pointer. For the purposes of
these programmes it is not necessary to make ES common with DS,
but this is generally useful in ASM88 programmes.
*/
FUN3CH_:
push bp ; normal De Smet C start
mov bp,sp ; point to the stack
mov ax,ds ; and make ES common with DS
mov es,ax
----------------------------------------------------------------------
The unique programme follows.
----------------------------------------------------------------------
/*
Take the values we need off the stack. Note the first value is
located at 'bp+4' because the return address is pushed first and
then 'bp' was pushed by us as we started the programme.
The values are placed into the three registers as required by
MS-DOS so that INT 21H can be used.
*/
mov dx,[bp+4] ; put address of file name into DX
mov cx,[bp+6] ; put the file attribute into CX
mov ah,3ch ; put the Function No. into AH
int 21h
/*
Now test to see whether the carry flag is set, which will tell
us that an error has occurred. If there is an error we use
a conditional jump to the code to handle this situation.
*/
jc FUN3CH_ERROR
/*
If there is no error then we just jump over the error coding
to the normal return routine.
*/
jmp FUN3CH_QUIT
/*
If there has been an error then we get the address of the
(external) carry flag variable and send the value of one
to this address. This is an example of the coding which
can be used to send a value to any external variable which
has previously had its address passed to the function.
*/
FUN3CH_ERROR:
mov si,[bp+8] ; put address of '_carryf' variable into SI
mov byte [si],1 ; and then return with _carryf = 1
/*
From this point the error routine just 'falls through' to the
normal programme termination where both the starting stack
conditions are restored and the starting Base Pointer is
restored.
*/
----------------------------------------------------------------------
Normal programme termination.
----------------------------------------------------------------------
FUN3CH_QUIT:
pop bp ; restore starting conditions
ret
----------------------------------------------------------------------